]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspacesDisplay: Disconnect MetaLater and parent signals on destroy
authorMarco Trevisan (Treviño) <mail@3v1n0.net>
Mon, 12 Aug 2019 14:25:48 +0000 (16:25 +0200)
committerFlorian Müllner <florian.muellner@gmail.com>
Mon, 9 Sep 2019 19:28:18 +0000 (19:28 +0000)
When the WorkspacesDisplay actor is destroyed we should remove the
ongoing later and parent widget connections to avoid accessing an
invalid object on callback.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700

js/ui/workspacesView.js

index af490e94aaaba4cfd73aa71bb478dce0cefa84d6..8c1ba81a6dfb7b7159c13aec4ff8b6a1850ea737 100644 (file)
@@ -524,6 +524,22 @@ var WorkspacesDisplay = class {
         this._keyPressEventId = 0;
 
         this._fullGeometry = null;
+
+        this.actor.connect('destroy', this._onDestroy.bind(this));
+    }
+
+    _onDestroy() {
+        if (this._notifyOpacityId) {
+            let parent = this.actor.get_parent();
+            if (parent)
+                parent.disconnect(this._notifyOpacityId);
+            this._notifyOpacityId = 0;
+        }
+
+        if (this._parentSetLater) {
+            Meta.later_remove(this._parentSetLater);
+            this._parentSetLater = 0;
+        }
     }
 
     _onPan(action) {
@@ -717,7 +733,11 @@ var WorkspacesDisplay = class {
             oldParent.disconnect(this._notifyOpacityId);
         this._notifyOpacityId = 0;
 
-        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
+        if (this._parentSetLater)
+            return;
+
+        this._parentSetLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
+            this._parentSetLater = 0;
             let newParent = this.actor.get_parent();
             if (!newParent)
                 return;